// import type {} from
// delete请求，不支持支付宝和头条小程序
const REQUEST_METHODS_MAP = new Map([
  ["get", "GET"],
  ["post", "POST"],
  ["put", "PUT"],
  ["delete", "DELETE"],
]);
let tokenName = uni.getStorageSync("chargeMINIapp::tokenName") || "X-token";
class Request {
  config: {
    baseUrl: string; // 请求的根域名
    header: {
      "Terminal-Type": string;
      "Content-Type": string;
      Loginclient: string;
    }; // 默认的请求头
    method: string;
    dataType: string; // 设置为json，返回后uni.request会对数据进行一次JSON.parse
    responseType: string; // 此参数无需处理，因为5+和支付宝小程序不支持，默认为text即可
    showLoading: boolean; // 是否显示请求中的loading
    loadingText: string;
    loadingTime: number; // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
    timer: any | undefined | null; // 定时器
    loadingMask: boolean;
  };
  interceptor: {
    // 请求拦截
    request(config: any): () => void;
    // 响应拦截
    response(response: any): any;
  };
  request: (
    url: any,
    method?: string,
    data?: {},
    header?: {}
  ) => Promise<unknown>;
  options: any;
  constructor() {
    this.config = {
      // baseUrl: 'https://api.gcl-kx.com/api/', // 请求的根域名
      baseUrl: '', // 请求的根域名
      header: {
        "Terminal-Type": "innerH5",
        "Content-Type": "application/json;charset=UTF-8",
        Loginclient: "Applet",
      }, // 默认的请求头
      method: "POST",
      dataType: "json", // 设置为json，返回后uni.request会对数据进行一次JSON.parse
      responseType: "text", // 此参数无需处理，因为5+和支付宝小程序不支持，默认为text即可
      showLoading: true, // 是否显示请求中的loading
      loadingText: "请求中...",
      loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
      timer: null, // 定时器
      loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
    };

    this.interceptor = {
      // 请求拦截
      request(config) {
        config.data = {
          ...config.data,
          // id: uni.getStorageSync("userData")?.id,
        };
        return config;
      },
      // 响应拦截
      response(response) {
        // console.log(response);
        if (response.data?.data?.id) {
          uni.setStorageSync("userData", {
            ...uni.getStorageSync("userData"),
            id: response.data.data.id,
          });
        }
        // 请求返回后，隐藏loading
        if (response?.data?.code === 401) {
          setTimeout(() => {
            // apiMemberUserWxLogin();
            // 跳转登录页
            uni.navigateTo({
              url: "/packageAuth/pages/login/phoneLogin",
            });
          }, 1000);
        }
        if (response.statusCode !== 200) {
          if (response?.data?.message) {
            uni.showToast({
              icon: "none",
              title: response?.data?.message,
              duration: 3000,
            });
          }
        }

        return response.data || {};
      },
    };
    this.request = (url, method = "get", data = {}, header = {}) => {
      return this.generate({
        url: this.config.baseUrl + url,
        method: REQUEST_METHODS_MAP.get(method),
        header,
        data,
      });
    };
  }
  /**
   * setConfig接收一个自定义的配置对象，将类中的config对象和它进行深度合并。
   * @param {Object} customConfig  深度合并对象，否则会造成对象深层属性丢失
   */
  generate(options: any) {
    // console.log(this)
    this.config.timer = setTimeout(() => {
      uni.showLoading({
        title: this.config.loadingText,
        mask:true
      });
    }, this.config.loadingTime);
    //检查请求拦截
    this.options = this.interceptor.request(options);
    options.dataType = options.dataType || this.config.dataType;
    options.responseType = options.responseType || this.config.responseType;
    options.url = options.url || "";
    options.params = options.params || {};
    options.header = Object.assign({}, this.config.header, options.header);
    options.method = options.method || this.config.method;

    return new Promise((resolve, reject) => {
      options.complete = (response: any) => {
        // 清除定时器，如果请求快，不用显示loading
        if (this.config.timer !== null) {
          clearTimeout(this.config.timer);
          this.config.timer=null;
        }

        this.config.timer = null;
        // 响应拦截
        let resInterceptors = this.interceptor.response(response);
        if (resInterceptors.isError) {
          reject(resInterceptors);
        } else {
          resolve(resInterceptors);
        }
      };
      uni.request(options);
    });
  }
}
export default new Request();
